Go switch vs if-else效率
全部标签 我目前用C++编写了一个程序,有时会使用300多个线程。在我的程序中,我有一个结构数组,数组的长度等于线程数。假设我有400个结构,因此有400个线程。在for循环的单次迭代中,我将一个函数应用于400个结构中的每一个,并且该函数在一个线程中执行。因此,我有400个线程同时运行。(我正在使用boost线程库)。我已尝试对我的代码进行segmentation(这不是实际代码):structmy_struct{//Structure'smembers};std::vectormy_vec;voidmy_fun(my_struct*my_str){//Operationsonmy_str}i
这个问题在这里已经有了答案:Isitbettertousestd::memcpy()orstd::copy()intermstoperformance?(8个答案)关闭7年前。使用memcpy和std::copy之间的效率损失有多严重?我有一种情况,我的系统上的vector实现似乎没有使用连续内存,这让我不得不稍后std::copy它的内容而不是做memcpy(dest,&vec[0],尺寸);.我不确定这对效率的影响有多严重。
如何重构以下C++代码?我在我的程序中使用C++11voidf(inta,intb,intc,intd,inte,intf){//MAX1..MAX6areconstants,N1..N6areconstantsif(a>MAX1){..codeblock1..}elseif(b>MAX2){..codeblock2..}elseif(c>MAX3){..codeblock..}elseif(d>MAX4){..codeblock3..}elseif(e>MAX5){..codeblock4..}elseif(f>MAX6){..codeblock5..}elseif((a>N1)&&
几天前,在阅读StandardC++news我读过关于DefaultedfunctionsinC++11的帖子,在那篇文章中提到用户定义的构造函数的效率低于编译器生成的构造函数:Theuser-defineddefaultconstructorislessefficientthanthecompilerimplicitlydefineddefaultconstructor.继续阅读,有一个用户定义的构造函数被标记为默认构造函数的示例,然后说:theexplicitlydefaultedconstructorismoreefficientthanamanuallyprogrammedde
如何在某个.cpp中判断某个类型是否为完整类型?templateclassTest{//somefieldsvoid(*functor)(T*)=[](T*){};//^willbewrittenbysome.cppthatcanaccessTascomplete-typeT*t=nullptr;voidfComplete(){deletet;//faster/**^somecodethatusecompletetype*/}voidfForward(){functor(t);//slower/**^somecodethatforwarddeclarationisenough*/}vo
我正在尝试从条目列表构建一组唯一的单词,每个条目都有一个字符串vector。所以我创建了一个名为Insert的函数,它会像这样为每个条目调用:for(auto&e:_Entries)_Dictionary.Insert(begin(e.getNameWords()),end(e.getNameWords()));_Dictionary类内部有一个集合(STL容器),我写了Insert函数如下:templatevoidInsert(InputIteratorfirst,InputIteratorlast){for(autoit=first;it!=last;++it)_AllWords.
我有一个程序可以使用fwrite保存许多>1GB的大文件它工作正常,但不幸的是,由于数据的性质,每次调用fwrite只写入1-4字节。结果写入可能需要一个多小时,大部分时间似乎是由于系统调用开销(或至少在fwrite的库函数中)。我对fread也有类似的问题。有谁知道任何现有的/库函数可以使用内联函数缓冲这些写入和读取,或者这是您自己的另一个卷? 最佳答案 首先,fwrite()是一个库而不是系统调用。其次,它已经缓冲了数据。您可能想尝试增加缓冲区的大小。这是通过使用setvbuf()完成的.在我的系统上,这只有一点点帮助,但YMM
以下C++无效,因为引用变量需要初始化器:int&a;//illegalif(isfive){a=5;}else{a=4;}但是,MSVC似乎认为这样没问题:int&a=isfive?5:4;这对我来说意味着MSVC实际上将条件运算符视为单个表达式,而不是将其扩展为if-else语句。使用条件运算符初始化引用是否总是有效的C++? 最佳答案 三元运算符不会扩展为if-else结构(不是根据语言,实现可能会生成等效的二进制文件,但在语言级别它们是不同的)。所以下面的代码是有效的:intfour=4,five=5;int&r=condi
今天,我阅读代码时使用查找表而不是if-else来裁剪两个求和的uint8值。映射在i={0...255}中为i,在i={256...511}中为255。我想知道这样做的yield有多大,并尝试使用gprof找出它,g++-std=c++0x-pgperfLookup.cpp-O2-operfLookup&&./perfLookup&&gprofperfLookup|less下面附上代码。现在没有-O2标志,gprof表示lookup()占用执行时间的45%,而ifelse()占用执行时间的48%。对于-O2,lookup()为56%,ifelse()为43%。但这个基准真的正确吗?也
我正在尝试优化一个小的、经常使用的函数,它使用unsignedshortint中的高位来指示要加在一起的数组的值。起初我使用的是如下所示的明显方法。请注意,循环展开并未明确显示,因为它应该由编译器完成。inttotal=0;for(unsignedshortmask=0x0001,j=0;mask!=0;mask但是,后来我认为删除分支以帮助CPU流水线可能会更好,并提出了以下建议。inttotal=0;for(unsignedshortmask=0x0001,j=0;mask!=0;mask请注意,由于(i&mask)不会产生bool值答案,因此与0的比较会强制结果为1或0。虽然第二